﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using Webshop.Models;

namespace Webshop.Controllers
{
    public class AccountController : Controller
    {
        private WebshopEntities db = new WebshopEntities();

        // GET: /Account/LogOn
        public ActionResult LogOn()
        {
            return View();
        }

        // POST: /Account/LogOn
        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    MigrateShoppingCart(model.UserName);

                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 
                        && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//")
                        && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }

                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Hibás a felhasználónév vagy a jelszó.");
                }
            }
            return View(model);
        }

        // GET: /Account/LogOff
        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Index", "Home");
        }

        // GET: /Account/Register
        public ActionResult Register()
        {
            return View();
        }

        // POST: /Account/Register
        [HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                MembershipCreateStatus createStatus;
                Membership.CreateUser(model.UserName, model.Password, model.Email,
                       "question", "answer", true, null, out createStatus);           

                if (createStatus == MembershipCreateStatus.Success)
                {
                    MigrateShoppingCart(model.UserName);

                    FormsAuthentication.SetAuthCookie(model.UserName, false /*createPersistentCookie */);
                    Roles.AddUserToRole(model.UserName, "User");
                    return RedirectToAction("Index", "Home");
                }

                else
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }
            return View(model);
        }

        // GET: /Account/ChangePassword
        [Authorize]
        public ActionResult ChangePassword()
        {
            return View();
        }

        // POST: /Account/ChangePassword
        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {
                bool changePasswordSucceeded;
                try
                {
                    MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
                    changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "Nem jó a jelenlegi jelszó, vagy az új jelszó nem érvényes");
                }
            }
            return View(model);
        }

        // GET: /Account/ChangePasswordSuccess
        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }

        // GET: /Account/Orders
        public ActionResult Orders()
        {
            var products = db.Orders;
            return View(products.ToList());
        }

        // GET: /Account/OrderDetails
        public ActionResult OrderDetails(int id)
        {
            var od = from u in db.OrderDetails
                               where u.OrderId == id
                               select u;  
            return View(od);
        }

        private void MigrateShoppingCart(string UserName)
        {
            var cart = ShoppingCart.GetCart(this.HttpContext);

            cart.MigrateCart(UserName);
            Session[ShoppingCart.CartSessionKey] = UserName;
        }

        #region Status Codes
        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // See http://go.microsoft.com/fwlink/?LinkID=177550 for
            // a full list of status codes.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "A felhasználónáv már létezik. Kérjük adjon meg másikat.";

                case MembershipCreateStatus.DuplicateEmail:
                    return "Már van felhasználónk ezzel az e-mail címmel. Jelentkezzen be, vagy adjon meg új e-mail címet.";

                case MembershipCreateStatus.InvalidPassword:
                    return "A jelszó érvénytelen. Kérjük érvényes jelszót adjon meg.";

                case MembershipCreateStatus.InvalidEmail:
                    return "Az e-mail cím érvénytelen. Kérjük érvényes e-mail címet adjon meg.";

                case MembershipCreateStatus.InvalidAnswer:
                    return "A jelszó emlékeztető válasz érvénytelen. Kérjük ellenőrizze és próbálja meg újra.";

                case MembershipCreateStatus.InvalidQuestion:
                    return "A jelszó emlékeztető kérdés érvénytelen. Kérjük ellenőrizze és próbálja meg újra.";

                case MembershipCreateStatus.InvalidUserName:
                    return "A felhasználónév érvénytelen. Kérjük ellenőrizze és próbálja meg újra.";

                case MembershipCreateStatus.ProviderError:
                    return "A hitelesítés szolgáltató hibát jelzett. Kérjük ellenőrizze az adatokat, és próbálja újra. Ha a probléma továbbra is fennáll, kérjük lépjen kapcsolatba a rendszergazdával.";

                case MembershipCreateStatus.UserRejected:
                    return "A felhasználó létrehozása nem sikerült. Kérjük ellenőrizze az adatokat, és próbálja újra. Ha a probléma továbbra is fennáll, kérjük lépjen kapcsolatba a rendszergazdával.";

                default:
                    return "Ismeretlen hiba történt. Kérjük, ellenőrizze az adatokat, és próbálja újra. Ha a probléma továbbra is fennáll, kérjük lépjen kapcsolatba a rendszergazdával.";
            }
        }
        #endregion
    }
}
